Ana içeriğe geç

Claimer Light DID 🌟

Artık Claimer için light DID oluşturmaya başlayabiliriz. 🚀

🤔 Bir de Light DID mi çıktı o ne?

Light DID, zincir üzerinde tutulmayan DID'lere denilmektedir. Zincir üzerinde tutulmadığı için oluştururken ekstra işlem ücretine gerek duymamaktadır. 🎉

Light DID'ler şunları yapabilir:

  • Doğrulama isteklerini ve sunumunu kimlik doğrulama anahtarlarıyla imzalayabilir. 🖋️
  • Encryption anahtarı ile mesajları şifreleyebilir. 🔒

alternative text

Gerekli Anahtarları Oluşturma 🔑

Attester'da olduğu gibi Claimer'ın da DID anahtarları oluşturması gerekmektedir. 🛠️

Paketlerin Eklenmesi 📦

claimer/generateKeypairs.ts
import * as Kilt from '@kiltprotocol/sdk-js'
import {
blake2AsU8a,
keyExtractPath,
keyFromPath,
mnemonicGenerate,
mnemonicToMiniSecret,
sr25519PairFromSeed
} from '@polkadot/util-crypto'
import { generateAccount } from '../attester/generateAccount'

İlk olarak importlarımızı yaparak işe başlıyoruz. 🌈 Bu importları Attester DID'lerini oluştururken de ayrıntılı görmüştük, ancak burada da kısaca bahsetmek gerekirse:

  • KILT SDK'yı ve Polkadot'un kripto yardımcı fonksiyonlarını import ediyoruz. 📚
  • Sonrasında generateAccount fonksiyonunu da import ediyoruz. 🗂️
🚨 generateAccount

Hesabı oluşturmak için gerekli işlemler her birey için aynı olduğundan dolayı generateAccount() fonksiyonuna attester klasöründen erişerek bir kez daha kodu yazma zorunluluğundan kurtulabiliriz. 🎉

generateKeyAgreement Fonksiyonu

claimer/generateKeypairs.ts
function generateKeyAgreement(mnemonic: string) {
const secretKeyPair = sr25519PairFromSeed(mnemonicToMiniSecret(mnemonic))
const { path } = keyExtractPath('//did//keyAgreement//0')
const { secretKey } = keyFromPath(secretKeyPair, path, 'sr25519')
return Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed(blake2AsU8a(secretKey))
}
🎓 Tanıdık geldi mi?

Bu fonksiyon attester'ın DID'sini oluştururken yazdığımız generateKeyAgreement() fonksiyonunun aynısı olmaktadır. O kısımda anladıysanız alt kısmı atlayıp bir sonraki fonksiyona gidebilirsiniz. 🏃‍♀️

Attester'da da benzerini oluşturduğumuz gibi ilk olarak anahtar çiftlerini oluşturmak için bu çiftlerin argümanlarını oluşturmamız gerekir. Bu işlem için generateKeyAgreement() fonsksiyonunu kullanacağız. Bu fonksiyon içerisine string formatında mnemonic anahtarı alacaktır. Çıktı olarak anahtar argümanlarını ifade edecektir. Sırasıyla içeriğine bakılacak olunursa:

  • sr25519PairFromSeed ve mnemonicToMiniSecret fonksiyonları ile gizli bir anahtar çifti oluşturulur.
  • keyExtractPath ve keyFromPath fonksiyonları ile anahtarın yolu ve gizli anahtar çıkarılır.
  • Son olarak, Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed fonksiyonu ile şifreleme anahtar çifti oluşturulur.

generateKeypairs Fonksiyonu

claimer/generateKeypairs.ts
export function generateKeypairs(mnemonic = mnemonicGenerate()) {
const { account } = generateAccount(mnemonic)
const authentication = {
...account.derive('//did//0'),
type: 'sr25519'
} as Kilt.KiltKeyringPair
const keyAgreement = generateKeyAgreement(mnemonic)
return {
authentication: authentication,
keyAgreement: keyAgreement
}
}

Anahtar argümanları ürettikten sonra bu argümanlar ile anahtar çiftlerini oluşturabiliriz. Bu işlem için generateKeypairs() fonksiyonu kullanılacaktır. Fonksiyonun işlevine bakılacak olunursa:

  • İlk olarak Bu fonksiyon, bir mnemonik alır (eğer verilmezse, yeni bir mnemonik oluşturur) ve kimlik doğrulama ve anahtar anlaşması anahtar çiftlerini oluşturur.
  • generateAccount() fonksiyonu kullanılarak mnemonic şifreden hesap oluşturulur.
  • account.derive ile kimlik doğrulama anahtarı oluşturulur.
    • account.derive('//did//0'): Hesaptan bir kimlik doğrulama çifti türetir.
    • type: 'sr25519': Anahtar çiftinin türünü belirtir.
    • as Kilt.KiltKeyringPair: Anahtar çiftinin türünü Kilt'in anahtar çifti türünde olduğunu belirtir.
  • generateKeyAgreement fonksiyonu ile anahtar anlaşması anahtarı oluşturulur.
  • Son olarak bu oluşturulan anahtarlar return kullanılarak çıktı edilir.
Birkaç Farklılık Var

Benzer işlemleri Attester için de yapmış olsak da birkaç farklılık fark etmiş olabilirsiniz. Bu farklılıklardan ilki attester için oluşturduğumuz DID'de 4 adet anahtar kullanmışken claimer için 2 adet oluşturmuş olmamızdır. Zincir üzerinde tutulmayacak ve imzalama işlemleri yapmayacağından dolayı claimer için bu 2 anahtar yeterlidir.

Kodun Tamamı

Anahtar argümanlarını oluşturmak için gerekli kodu yazdık. Bu kodu şu şekilde tamamıyla görüntüleyebiliriz.

claimer/generateKeypairs.ts
import * as Kilt from '@kiltprotocol/sdk-js'
import {
blake2AsU8a,
keyExtractPath,
keyFromPath,
mnemonicGenerate,
mnemonicToMiniSecret,
sr25519PairFromSeed
} from '@polkadot/util-crypto'
import { generateAccount } from './generateAccount'

function generateKeyAgreement(mnemonic: string) {
const secretKeyPair = sr25519PairFromSeed(mnemonicToMiniSecret(mnemonic))
const { path } = keyExtractPath('//did//keyAgreement//0')
const { secretKey } = keyFromPath(secretKeyPair, path, 'sr25519')
return Kilt.Utils.Crypto.makeEncryptionKeypairFromSeed(blake2AsU8a(secretKey))
}

export function generateKeypairs(mnemonic = mnemonicGenerate()) {
const { account } = generateAccount(mnemonic)

const authentication = {
...account.derive('//did//0'),
type: 'sr25519'
} as Kilt.KiltKeyringPair

const keyAgreement = generateKeyAgreement(mnemonic)

return {
authentication: authentication,
keyAgreement: keyAgreement
}
}
bilgi

Claimer authentication key (doğrulama anahtarı) ve encryption key (şifreleme anahtarı) değerlerine sahip olmalıdır. Bu anahtarlar aynı mnemonic şifre kullanılarak üretilebilse de farklı mnemonic şifreler de kullanılabilir.

Light DID Oluşturma

keypair değerlerini oluşturduktan sonra light DID'leri üretebiliriz. Zincir üzerinde depolanmadığı için her seferinde yeni bir DID objesi oluşturabiliriz, her seferinde kaydetmemize gerek bulunmamakta. Ancak yine de mneminic şifreyi .env dosyası üzerinde kaydedeceğiz.

alternative text

Paket Ekleme

claimer/generateLightDid.ts
import { config as envConfig } from 'dotenv'
import { mnemonicGenerate } from '@polkadot/util-crypto'
import * as Kilt from '@kiltprotocol/sdk-js'
import { generateKeypairs } from './generateKeypairs'

Paketlerimizi generateLightDid.ts dosyası içerisine import ediyoruz bu paketlere ek olarak generateKeypairs yapısının olduğunu görüntüleyebiliriz. Bu yapı bir önceki dosyada export ederek yazdığımız generateKeypairs() fonksiyonuna erişmemizi sağlar.

generateLightDid Fonksiyonu

claimer/generateLightDid.ts
export function generateLightDid(mnemonic: string): Kilt.DidDocument {
const { authentication, keyAgreement } = generateKeypairs(mnemonic)
return Kilt.Did.createLightDidDocument({
authentication: [authentication as Kilt.NewLightDidVerificationKey],
keyAgreement: [keyAgreement]
})
}

Artık Claimer bireyi için oluşturacağımız DID'nin oluşacağı fonksiyonu yazabiliriz. Bu fonksiyon içerisine mnemonic anahtarı alacak olup çıktı olarak Claimer DID değerini verecektir. Satır satır kodun yaptıklarına bakılacak olunursa:

  • İlk olarak authentication ve keyAgreement değişkenleri oluşturulup bir önceki kod dosyasında yazdığımız generateKeypairs() fonksiyonu içerisine mnemonic şifreyi alarak çalışır.
  • Devamında bu değişkenler Kilt.Did.createLightDidDocument() methoduna girdi olarak verilerek Light DID oluşturulur ve çıktı verilir.

Ana Kod Bloğu

claimer/generateLightDid.ts
if (require.main === module) {
;(async () => {
envConfig()
try {
await Kilt.init()
const mnemonic = mnemonicGenerate()
console.log('\nsave following to .env to continue\n')
console.log(`CLAIMER_DID_MNEMONIC="${mnemonic}"`)
} catch (e) {
console.log('Error while setting up claimer DID')
throw e
}
})()
}

Bu kod bloğu generateLightDid.ts dosyası doğrudan çalıştırılırsa çalışacak fonksiyondur. Fonksiyonun içerisine girildiğinde ilk olarak envConfig fonksiyonu ile .env dosyasındaki bilgiler erişilir. Devamında try catch yapısına girilir. Bu yapıda izlenen işlemlere bakılacak olunursa:

  • Kilt.init() ile KILT SDK başlatılır.
  • Yeni bir mnemonik oluşturulur ve konsola yazdırılır. Bu mnemonik .env dosyasına kaydedilmelidir.
  • Eğer bir hata oluşursa, hata mesajı konsola yazdırılır ve hata fırlatılır.

Tüm işlemler tamamladıktan sonra Light DID için kullanılacak mnemonic anahtarı üretmiş oluruz. Fark etmiş olabileceğiniz gibi Claimer'ın herhangi bir hesap adresi veya hesabı yoktur. Bu durumun nedeni Claimer'ın herhangi bir bakiye tutmak zorunda olmaması ve zincirde hesap oluşturma zorunluluğunun olmamasıdır.

Güzel Özellik Aslında

Claimer bireyinin zincir içerisinde hesap oluşturma zorunluluğunun olmaması bizlere birçok alanda kolaylık sağlamaktadır. Örneğin Claimer bireyi herhangi biri olabileceği için blokzinciri bile bilmeyen bir kullanıcı hesap açmadan veya ne ile karşı karşıya kaldığını anlamasına gerek kalmadan arayüzden bu işlemleri gerçekleştirebilir.

Genel İşleyiş

Yazdığımız generateLightDid.ts kodunun tamamına bakarak yaptığımız işlemleri daha iyi anlamamız gerekirse:

claimer/generateLightDid.ts
import { config as envConfig } from 'dotenv'

import { mnemonicGenerate } from '@polkadot/util-crypto'

import * as Kilt from '@kiltprotocol/sdk-js'

import { generateKeypairs } from './generateKeypairs'

export function generateLightDid(mnemonic: string): Kilt.DidDocument {
const { authentication, keyAgreement } = generateKeypairs(mnemonic)
return Kilt.Did.createLightDidDocument({
authentication: [authentication as Kilt.NewLightDidVerificationKey],
keyAgreement: [keyAgreement]
})
}

// Don't execute if this is imported by another file.
if (require.main === module) {
;(async () => {
envConfig()

try {
await Kilt.init()

const mnemonic = mnemonicGenerate()
console.log('\nsave following to .env to continue\n')
console.log(`CLAIMER_DID_MNEMONIC="${mnemonic}"`)
} catch (e) {
console.log('Error while setting up claimer DID')
throw e
}
})()
}
  • Paketlerimizi ve generateKeypairs.ts dosyasını dosyamız içerisine ekledik.
  • Anahtar argümanları çağırarak Light DID oluşturma fonksiyonunu oluşturduk.
  • Kodun tek başına çalıştırılma olasılığına karşın generateLightDid() fonksiyonunu çalıştıracak ve Light DID'e ait mnemonic şifreyi ekrana yazacak bir fonksiyon yapısı kurduk.

Kodu Çalıştırma

Yazdığımız birbirine bağlı 2 kodu çalıştırmak için kilt-rocks klasöründe olduğumuza emin olduktan sonra alt kısımdaki kodu çalıştırabiliriz.

yarn ts-node ./claimer/generateLightDid.ts
Sakın Unutma!

Kodu çalıştırdıktan sonra bizlere bir CLAIMER_DID_MNEMONIC değeri verilecektir. bu değeri kesinlikle .env dosyamıza kaydetmemiz gerekir.

alternative text

ipucu

Harikasın beee Light DID de oluşturdun